#include "RAMP.h"

RAMP_T* RAMP_t;
BAK_Attend_Para_t RAMP_Attend_Para = {4, 10};

//************************************
// Method:    	CALCU_SAMA						//< SAMA运算函数
// Programmer:  lww
// Time:		2019/03/19
// Returns:   	bool							//< 成功：true；失败：false
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	float dt						//< 运算周期
// Parameter: 	bool * DI						//< 数字量输入值数组指针
// Parameter: 	bool * DO						//< 数字量输出值数组指针
// Parameter: 	bool * AI						//< 模拟量输入值数组指针
// Parameter: 	bool * AO						//< 模拟量输出值数组指针
//************************************
bool CALCU_SAMA(RAMP)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO)
{
	/****************变量定义区开始**************/
	/*static bool duanFlag1 = false;
	static bool duanFlag2 = false;
	static struct timespec time0, time1;*/
	
	/*<<<<<定义输入变量>>>>>*/
	bool Enable;				
	
	/*<<<<<定义输出变量>>>>>*/
	float Output_Value;			
	
	/*<<<<<定义参数变量>>>>>*/
	float Init_Value;			//< 斜坡响应初始值
	float Slope_Value;			//< 斜率值
	float Time;					//< 斜坡响应需等待的时间
	float H_Limit;              //< 上限值
	float L_Limit;              //< 下限值
	
	/*<<<<<定义中间变量>>>>>*/
	float* Time_Sum;		    //< 斜坡响应等待时间累积值
	float* Ramp_AO;             //< 斜坡模块模拟量输出
	float* Time_Last;           //< 记录上一次发生时间
	/****************变量定义区结束**************/
	
	NAME(RAMP)* Obj = (NAME(RAMP)*)arg;

	/****************变量赋值**************/
	/*<<<<<输入变量赋值>>>>>*/
	Enable = DI[0];
	
	/*<<<<<参数变量赋值>>>>>*/
	Init_Value = Obj->Par.Init_Value;
	Slope_Value = Obj->Par.Slope_Value;
	Time = Obj->Par.Time;
	H_Limit = Obj->Par.H_Limit;
	L_Limit = Obj->Par.L_Limit;
	
	/*<<<<<中间变量赋值>>>>>*/
	Time_Sum = &(Obj->Sta.Time_Sum);
	Ramp_AO = &(Obj->Sta.Ramp_AO);
	Time_Last = &(Obj->Sta.Time_Last);
	/**************变量赋值结束************/

	/********************************************/
	/**************算法功能实现开始**************/
	/********************************************/
	if (Time_Last[0] != Time)
	{
		Time_Sum[0] = 0;
		Ramp_AO[0] = Init_Value;
		Time_Last[0] = Time;
	}
	if (Enable == false)
	{
		Ramp_AO[0] = Init_Value;
		Time_Sum[0] = 0;
	}
	else
	{
		if (Time_Sum[0] >= Time)
		{
			//if (false == duanFlag1)												//< duan191011 修改
			//{
			//	time0 = RealTime_Get();
			//	duanFlag1 = true;
			//}

			Time_Sum[0] = Time;
			Ramp_AO[0] += Slope_Value * dt;																											
		}
		Time_Sum[0] = Time_Sum[0] + dt;
	}
	/*if (Ramp_AO[0] > H_Limit)
		Ramp_AO[0] = H_Limit;*/													//< duan191011 注释


	if (Ramp_AO[0] > H_Limit)
	{
		Ramp_AO[0] = H_Limit;
		//if (false == duanFlag2)
		//{
		//	time1 = RealTime_Get();
		//	printf("the time span is %d\r\n", Dt_Calu(time1, time0));			//< duan191011修改
		//	duanFlag2 = true;
		//}
	}
	if (Ramp_AO[0] < L_Limit)
		Ramp_AO[0] = L_Limit;
	Output_Value = Ramp_AO[0];
	//**************算法功能实现结束**************/
	/********************************************/	

	/****************运算结果输出**************/
	AO[0] = Output_Value;
	/**************运算结果输出完毕************/
	return true;
}



//************************************
// Method:    	BCPARA							//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 广播SAMA参数的数据包的指针
//************************************
int BC_PARA(RAMP)(Model_Base_t* arg, void** Data)
{
	NAME(RAMP)* Obj = (NAME(RAMP)*)arg;
	BC_PARA_PUBLIC(Obj);
	return 0;
}



//************************************
// Method:    	BAK_STA							//< 备份SAMA运算中间参数
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 指定模块类型链表的指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int BAK_STA(RAMP)(Model_Base_t* arg, void** Data)
{
	NAME(RAMP)* Obj = (NAME(RAMP)*)arg;
	BAK_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	ANA_STA							//< 解析备份的SAMA运算中间参数
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int								//< 成功：返回解析字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int ANA_STA(RAMP)(Model_Base_t* arg, void** Data)
{
	NAME(RAMP)* Obj = (NAME(RAMP)*)arg;
	ANA_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	CHANGE_PAR				//< 在线修改模块参数函数
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int						//< 读取字节长度计数值
// Parameter: 	Model_Base_t* arg		//< 指定模块类型链表的指针
// Parameter: 	void** Data				//< 存放数据包当前指针位置的地址
//************************************
int CHANGE_PAR(RAMP)(Model_Base_t* arg, void** Data)
{
	int _iLen = 0;
	MEMREAD(((NAME(RAMP)*)arg)->Par, Data[0]);
	return _iLen;
}



//************************************
// Method:    	INIT_STAPAR						//< 初始化模块运算中间参数
// Programmer:  duan
// Time:		2019/02/26
// Parameter: 	Model_Base_t* arg				//< 模块参数结构体指针
//************************************
void INIT_STAPAR(RAMP)(Model_Base_t* arg)
{
	NAME(RAMP)* name = (NAME(RAMP)*)arg;
	/****************初始化中间变量结构体**************/
	memset(&(name->Sta), 0, sizeof(name->Sta));
	/**************初始化中间变量结构体结束************/
	
	/****************对中间变量结构体的相关参数进行赋值**************/
	name->Sta.Ramp_AO = name->Par.Init_Value;
	name->Sta.Time_Last = name->Par.Time;
	/**************对中间变量结构体的相关参数进行赋值结束************/
}
